package jichu;

/**
 * ClassName: test1
 * Description:
 *
 * @Author liu
 * @Create 2024/9/20 10:53
 * @Version 1.0
 */

public class array {
    public static void main(String[] args) {

        //复习数组
//        int[][] arr=new int[3][4];
//        int[][] arr1=new int[][]{{1,3},{4,5},{6}};
//        for (int i = 0; i < arr.length; i++) {
//            for (int j = 0; j <arr[i].length ; j++) {
//                System.out.print(arr[i][j]+" ");
//                //整型  0
//                //字符型 0
//                //浮点型 0.0
//                //布尔型 false
//                //引用类型 null
//
//
//            }
//
//        }


        /**
         *  使用二维数组打印一个 10 行杨辉三角。
         *
         *            提示：
         *            1. 第一行有 1 个元素, 第 n 行有 n 个元素
         *            2. 每一行的第一个元素和最后一个元素都是 1
         *            3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即：
         *            yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
         */

//        int[][] yanghui = new int[10][];
//        //初始化数组
//        for (int i = 0; i < yanghui.length ; i++) {
//            // 每一行包含的元素数量等于行索引 i 加一
//            yanghui[i] = new int[i+1];
//
//            //每一行的第一个元素
//            // 最后一个元素都是 1
//            yanghui[i][0] = 1;
//            yanghui[i][i] = 1;
//
//            //从第三行开始, 对于非第一个元素和最后一个元素的元素
//            for (int j = 1; j < yanghui[i].length-1 ; j++) {
//                yanghui[i][j] =yanghui[i-1][j-1] + yanghui[i-1][j];
//            }
//        }
//        for (int i = 0; i <yanghui.length ; i++) {
//            for (int j = 0; j <yanghui[i].length ; j++) {
//                System.out.print(yanghui[i][j]+" ");
//            }
//            System.out.println();
//        }



        /**
         * 数组扩容
         * 现有数组 int[] arr = new int[]{1,2,3,4,5};
         * 现将数组长度扩容1倍(<< 1)，并将10,20,30三个数据添加到arr数组中，如何操作？
         */


//        int[] arr = new int[]{1,2,3,4,5};
//        int[] newarr = new int[arr.length << 1];
//        //arr.length *2
//        for (int i = 0; i <arr.length ; i++) {
//            newarr[i] =arr[i];
//        }
//        newarr[arr.length]=10;
//        newarr[arr.length +1]=20;
//        newarr[arr.length +2]=30;
//
//        //代换
//        arr = newarr;
//        for (int i = 0; i <arr.length ; i++) {
//            System.out.print(arr[i]+" ");
//
//        }


        /**
         *  缩容
         *  现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素
         */

        //不建数组
//        int[] arr = new int[]{1,2,3,4,5,6,7};
//        int indent = 4;
//        for (int i = indent; i <arr.length-1; i++) {
//            arr[i]=arr[i+1];
//        }
//        arr[arr.length-1]= 0;
//        for (int i = 0; i <arr.length ; i++) {
//            System.out.print(arr[i]+" ");
//
//        }

        //建数组
//        int[] arr =new int[]{1,2,3,4,5,6,7};
//        int indent = 4;
//        int[] newarr = new int[arr.length -1];
//        for (int i = 0; i < indent; i++) {
//            newarr[i] = arr[i];
//        }
//        for (int j = indent; j <arr.length-1; j++) {
//            newarr[j]= arr[j+1];
//        }
//        arr = newarr;
//        for (int i = 0; i <arr.length ; i++) {
//            System.out.print(arr[i]+" ");
//        }


        /**
         * 线性查找
         *
         * 定义数组：int[] arr1 = new int[]{34,54,3,2,65,7,34,5,76,34,67};
         * 查找元素5是否在上述数组中出现过？如果出现，输出对应的索引值。
         */
//        int[] arr = new int[]{34, 54, 3, 2, 65, 7, 34, 5, 76, 34, 67};
//        boolean flag = true;
//        int num = 50;
//        for (int i = 0; i < arr.length; i++) {
//            if (num == arr[i]) {
//                System.out.println("找到了，" + "在第" + i + "位");
//                flag = false;
//                break;
//            }
//
//        }
//        if(flag){
//            System.out.println("抱歉，没有找到。");
//        }


        /**
         * 二分法查找 ==>递增或递减
         * 1.定义目标元素
         * 2.定义首，尾，找到中间数
         * 3判断目标元素与中间大小，
         * 4 大了；首=中+1；小了：尾=中-1
         *
         * 定义数组：int[] arr2 = new int[]{2,4,5,8,12,15,19,26,37,49,51,66,89,100};
         * 查找元素5是否在上述数组中出现过？如果出现，输出对应的索引值。
         */

//        int[] arr2 = new int[]{2, 4, 5, 8, 12, 15, 19, 26, 37, 49, 51, 66, 89, 100};
//        int target = 5;
//        boolean flag = true;
//
//        int head = 0;
//        int end = arr2.length-1;
//
//        while (head < end) {
//            int mid = (head + end) / 2;
//            if (target == arr2[mid]) {
//                System.out.print("找到了，" + "在第" + mid + "位");
//                flag = false;
//                break;
//            } else if (target > arr2[mid]) {
//                head = mid + 1;
//            } else {
//                end = mid - 1;
//            }
//        }
//        if(flag){
//            System.out.print("抱歉，没有找到");
//        }
//




        /**
         * 使用冒泡排序，实现整型数组元素的排序操作
         *前后对比，进行排序(内外两个循环（一个判断排序个数，零一个判断相邻大小）)
         * 比如：int[] arr = new int[]{34,54,3,2,65,7,34,5,76,34,67};
         */

        int[] arr = new int[]{34,54,3,2,65,7,34,5,76,34,67};
        //遍历
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }

        //冒泡
        // 外层循环控制排序轮数，每轮找到一个最大元素的位置
        for (int i = 0; i <arr.length -1 ; i++) {
            // 内层循环用于比较相邻元素并进行交换
            // 随着每轮排序完成，未排序部分的长度减少，因此循环次数也相应减少
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }

            }
        }
     System.out.println();
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }

    }
}


